.equ ADDR_JP1, 0x10000060 /* Address GPIO JP1*/ .equ PERIOD, 0xa .global main main: movia r8, ADDR_JP1 movia r10, 0x07f557ff /* set direction for motors and sensors to output and sensor data register to inputs*/ stwio r10, 4(r8) LOOP0: movia r11, 0xfffffbff /* enable sensor 0, disable all motors*/ stwio r11, 0(r8) ldwio r5, 0(r8) /* checking for valid data sensor 0*/ srli r5, r5,11 /* bit 11 equals valid bit for sensor 0*/ andi r5, r5,0x1 /* check if the valid bit is 0 or 1*/ cmpeqi r6, r5,0x1 beq r0, r6,SEN0 /* checking if low indicated polling data at sensor 0 is valid*/ br LOOP0 LOOP4: movia r11, 0xfffeffff /* enable sensor 4, disable all motors*/ stwio r11, 0(r8) ldwio r5, 0(r8) /* checking for valid data sensor 4*/ srli r5, r5,17 /* bit 19 equals valid bit for sensor 4*/ andi r5, r5,0x1 /* check if the valid bit is 0 or 1*/ cmpeqi r6, r5,0x1 beq r0, r6,SEN4 /* checking if low indicated polling data at sensor 4 is valid*/ br LOOP4 SEN0: ldwio r10, 0(r8) /* read sensor 0 value (into r10) */ srli r10, r10, 27 /* shift to the right by 27 bits so that 4-bit sensor value is in lower 4 bits */ movi r3,0x14 ble r10, r3, MOTCNW /* if sensor 0 has a value less than 3 then move clockwise*/ br LOOP4 SEN4: ldwio r10, 0(r8) /* read sensor 4 value (into r10) */ srli r10, r10, 27 /* shift to the right by 27 bits so that 4-bit sensor value is in lower 4 bits */ movi r5,0x15 ble r10, r5, MOTCW /* if sensor 4 has a value less than 5 then move counter clockwise*/ br LOOP0 MOTCW: movia r9, 0xfffffffc /* motor0 enabled (bit0=0), direction set to forward (bit1=0) */ stwio r9, 0(r8) br TIMER MOTCNW: movia r9, 0xfffffffe /* motor0 enabled (bit0=0), direction set to reverse (bit1=0) */ stwio r9, 0(r8) br TIMER TIMER: movia r7, 0x10002000 /* r7 contains the base address for the timer */ stwio r0, 0(r7) movui r2, 100 stwio r2, 8(r7) /* Set the period to be 1000 clock cycles */ stwio r0, 12(r7) movui r2, 4 stwio r2, 4(r7) /* Start the timer without continuing or interrupts */ br TIMERCHK TIMERCHK: movia r7, 0x10002000 /* r7 contains the base address for the timer */ movi r6, 1 ldwio r3, 0(r7) bne r3,r6, TIMERCHK movi r4,1000 call TIMER2 br LOOP0 TIMER2: movia r7, 0x10002000 /* r7 contains the base address for the timer */ movia r11, 0xffffffff /* enable sensor 0, disable all motors*/ stwio r0, 0(r7) mov r2, r4 stwio r2, 8(r7) /* Set the period to be 1000 clock cycles */ stwio r0, 12(r7) movui r2, 4 stwio r2, 4(r7) /* Start the timer without continuing or interrupts */ br TIMERCHK2 TIMERCHK2: movia r7, 0x10002000 /* r7 contains the base address for the timer */ movi r6, 1 ldwio r3, 0(r7) bne r3,r6, TIMERCHK2 ret #BY FATROCK #thanks